package br.com.duosoftware.orcamento.daos;

import br.com.duosoftware.orcamento.hibernate.HibernateUtil;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Daniel
 * 
 */
public class DAOGenerico implements Serializable{

    private Session getSession() {
        return HibernateUtil.getInstance().getSession();
    }

    protected void salvarPojo(Serializable pojo) {
        Session session = getSession();
        session.save(pojo);
        session.getTransaction().commit();
        session.close();
    }

    protected void salvarOuAtualizarPojo(Serializable pojo){
        Session session = getSession();
        session.saveOrUpdate(pojo);
        session.getTransaction().commit();
        session.close();
    }

    protected void atualizarPojo(Serializable pojo){
        Session session = getSession();
        session.update(pojo);
        session.getTransaction().commit();
        session.close();
    }

    protected void excluirPojo(Serializable pojo) {
        Session session = getSession();
        session.delete(pojo);
        session.getTransaction().commit();
        session.close();
    }

    protected <T extends Serializable> T getPojo(Class<T> classToSearch, Serializable key) {
        Session ses = getSession();
        Serializable toReturn = (Serializable) ses.get(classToSearch, key);
        ses.getTransaction().commit();
        ses.close();
        return (T) toReturn;
    }

    public <T extends Serializable> T getPojoCriterio(String query, Object... params) {
        Session ses = getSession();

        Query qr = ses.createQuery(query);

        for(int i = 0; i < params.length; i++){
            qr.setParameter(i, params[i]);
        }

        Serializable toReturn = (Serializable)qr.uniqueResult();

        ses.getTransaction().commit();
        ses.close();
        return (T)toReturn;
    }

    protected <T extends Serializable> List<T> getPojos(String query, Object... params) {
        Session session = getSession();
        Query qr = session.createQuery(query);
        for (int i = 0; i < params.length; i++) {
            qr.setParameter(i, params[i]);
        }
        List<T> retorno = qr.list();
        session.getTransaction().commit();
        session.close();
        return (List<T>) retorno;
    }

}
